{ "cells": [ { "cell_type": "markdown", "id": "continuous-certificate", "metadata": {}, "source": [ "
\n", " PANDAS\n", "
\n", "

Navigation dans la page

\n", "

\n", " Si c'est votre première visite dans ce TP, lisez attentivement chacun des points détaillé après ce paragraphe.
\n", " Si vous avez déjà commencer à travailler sur ce TP et que vous souhaiter vous déplacer rapidement dans une partie précise vous pouvez choisir la partie que vous souhaitez rejoindre ci-dessous. N'oubliez pas de réexecuter les case contenant des bibliothèques nécessaire au reste du code.
\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

\n", "\n", "
\n", " Technologie jupyter\n", "

\n", " La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
\n", " Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
\n", " Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
\n", " La plateforme propose quelques outils de purge de la mémoire : \n", "

\n", "

\n", "
\n", "

SAUVEGARDER VOTRE TRAVAIL

\n", "

\n", " Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S\n", " est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.

\n", "

A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.\n", "

    \n", "
  1. Lancer un terminal
  2. \n", "
  3. Taper la commande suivante : pip install jupyterlab
  4. \n", "
  5. Une fois l'installation terminée portez votre attention sur les dernières lignes affichées dans votre terminal vous invitant probablement à taper une ligne de commande pour faire une mise à jour
  6. \n", "
  7. Pour lancer notebook de jupyter, taper dans votre termial : jupyter notebook
  8. \n", "
  9. Votre simulateur de serveur est lancé. Il ne faut pas fermer votre terminal, auquel cas votre simulateur de serveur s'interompera. Suivez le lien indiqué dans les dernières lignes de votre terminal pour vous diriger vers votre espace local. L'interface se présente comme celle que vous trouverez sur le web. Votre travail sera cependant toujours enregistré et jamais perdu même si vous le consultez après plusieurs jours
  10. \n", "
\n", "

\n", "
\n", "
" ] }, { "cell_type": "markdown", "id": "generous-healthcare", "metadata": {}, "source": [ "

La bibliothèque PANDAS

\n", "

pandas est (probablement) python analysis datas. C'est une bibliothèque de gestion des données a l'aide de dataframe. Commençons par charger cette bibliothèque à l'aide de de l'alias pd.

" ] }, { "cell_type": "code", "execution_count": 1, "id": "operating-details", "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "id": "heard-employment", "metadata": {}, "source": [ "

Les séries

" ] }, { "cell_type": "markdown", "id": "suspected-october", "metadata": {}, "source": [ "

Pour illustrer cette partie, considérons deux étudiants Alice et Bob avec des notes en mathématiques, statistique et informatique.

" ] }, { "cell_type": "code", "execution_count": 2, "id": "outside-table", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alice = {'Math': 15, 'Stat': 18, 'Proba': 8}\n", "Bob = {'Math': 10.5, 'Stat': 9, 'Proba': 10, 'Info': 17}\n" ] } ], "source": [ "Alice={\n", " 'Math':15,\n", " 'Stat':18,\n", " 'Proba':8\n", "}\n", "Bob={\n", " 'Math':10.5,\n", " 'Stat':9,\n", " 'Proba':10,\n", " 'Info':17\n", "}\n", "print(\"Alice =\", Alice)\n", "print(\"Bob =\", Bob)" ] }, { "cell_type": "markdown", "id": "internal-audio", "metadata": {}, "source": [ "

Le premier outil que pandas nous offre est la création de serie que l'on peut extraire d'un jeu de donnée à l'aide la fonction eponyme.

" ] }, { "cell_type": "code", "execution_count": 3, "id": "worse-deviation", "metadata": {}, "outputs": [], "source": [ "serieAlice = pd.Series(Alice)" ] }, { "cell_type": "markdown", "id": "transsexual-cyprus", "metadata": {}, "source": [ "

Affichons cette série.

" ] }, { "cell_type": "code", "execution_count": 4, "id": "nearby-bunny", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Math 15\n", "Stat 18\n", "Proba 8\n", "dtype: int64\n" ] } ], "source": [ "print(serieAlice)" ] }, { "cell_type": "markdown", "id": "dried-mistake", "metadata": {}, "source": [ "

On constate que python (et jupyter) affiche les données de Alice en deux colonnes (parfaitement alignées) contenant dans la première le nom des étiquettes des données (le nom des matières) et la seconde la valeur des données (les notes).

\n", "\n", "

Vous constaterez que le print a également préciser le type de la donnée (dtype qui sont ici des entiers).

\n", "\n", "

Affichez la série de bob.

" ] }, { "cell_type": "code", "execution_count": 5, "id": "communist-usage", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Math 10.5\n", "Stat 9.0\n", "Proba 10.0\n", "Info 17.0\n", "dtype: float64\n" ] } ], "source": [ "serieBob=pd.Series(Bob)\n", "print(serieBob)" ] }, { "cell_type": "markdown", "id": "republican-artist", "metadata": {}, "source": [ "

Observez que le type des données est différent.

" ] }, { "cell_type": "markdown", "id": "instrumental-sussex", "metadata": {}, "source": [ "

il est possible de récupérer d'une par les étiquettes et d'autre par les données. Ce sont les méthodes index et array.

" ] }, { "cell_type": "code", "execution_count": 6, "id": "focused-prize", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['Math', 'Stat', 'Proba'], dtype='object')\n" ] } ], "source": [ "print(serieAlice.index)" ] }, { "cell_type": "code", "execution_count": 7, "id": "willing-wings", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[10.5, 9.0, 10.0, 17.0]\n", "Length: 4, dtype: float64\n" ] } ], "source": [ "print(serieBob.array)" ] }, { "cell_type": "markdown", "id": "patent-might", "metadata": {}, "source": [ "

Vous observez que ces listes sont des types particuliers de pandas. Gardez en tête qu'ils se comportent comme des listes classique (vous pouvez les caster en list si vous le souhaitez) et que vous pouvez appliquer les outils classique sur les listes.

" ] }, { "cell_type": "code", "execution_count": 8, "id": "sensitive-audience", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Il y a 3 matières pour Alice\n", "Il y a 4 notes pour Bon\n", "La seconde note de Bob est Stat\n", "La dernière note qu'Alice a eu vaut 8\n", "Les 4 notes de bob sont : 10.5 9.0 10.0 17.0 \n", "Les matières dans lesquelles Alice a une note sont ['Math', 'Stat', 'Proba']\n" ] } ], "source": [ "print(\"Il y a\", len(serieAlice.index), \"matières pour Alice\")\n", "print(\"Il y a\", len(serieBob.array), \"notes pour Bon\")\n", "print(\"La seconde note de Bob est\", serieBob.index[1])\n", "print(\"La dernière note qu'Alice a eu vaut\", serieAlice.array[-1])\n", "\n", "print(\"Les\", len(serieBob.array), \"notes de bob sont\", end=' : ')\n", "for noteBob in serieBob.array : \n", " print(noteBob, end=' ')\n", "print()\n", "print(\"Les matières dans lesquelles Alice a une note sont\", list(serieAlice.index))" ] }, { "cell_type": "markdown", "id": "manufactured-craft", "metadata": {}, "source": [ "

Vous aurez remarqué qu'Alice et Bob n'ont pas le même nombre de note. Il est possible de préciser, au moment de la récupération des notes (données), les matières (étiquettes) qui nous intérèssent (et même dans l'ordre qui nous intérèsse).

" ] }, { "cell_type": "code", "execution_count": 9, "id": "sexual-trace", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alice\n", "Math 15\n", "Stat 18\n", "Proba 8\n", "dtype: int64\n", "Bob\n", "Math 10.5\n", "Stat 9.0\n", "Proba 10.0\n", "dtype: float64\n" ] } ], "source": [ "serieAlice=pd.Series(Alice, index=['Math', 'Stat', 'Proba'] )\n", "print('Alice')\n", "print(serieAlice)\n", "serieBob=pd.Series(Bob, index=['Math', 'Stat', 'Proba'] )\n", "print('Bob')\n", "print(serieBob)" ] }, { "cell_type": "code", "execution_count": 10, "id": "vietnamese-skill", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alice\n", "Math 15.0\n", "Stat 18.0\n", "Proba 8.0\n", "Info NaN\n", "INFO NaN\n", "dtype: float64\n", "Bob\n", "Math 10.5\n", "Stat 9.0\n", "Proba 10.0\n", "Info 17.0\n", "INFO NaN\n", "dtype: float64\n" ] } ], "source": [ "serieAlice=pd.Series(Alice, index=['Math', 'Stat', 'Proba', 'Info', 'INFO'] )\n", "print('Alice')\n", "print(serieAlice)\n", "serieBob=pd.Series(Bob, index=['Math', 'Stat', 'Proba', 'Info', 'INFO'] )\n", "print('Bob')\n", "print(serieBob)" ] }, { "cell_type": "markdown", "id": "animated-madison", "metadata": {}, "source": [ "

Pas de blague ! NaN est pour not a number pour préciser que la donnée n'existe pas.

" ] }, { "cell_type": "markdown", "id": "suspended-commonwealth", "metadata": {}, "source": [ "

A l'aide d'une boucle for affichez une par une les notes d'Alice (la dernière variable serieAlice" ] }, { "cell_type": "code", "execution_count": 11, "id": "silent-review", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15.0 18.0 8.0 nan nan " ] } ], "source": [ "for noteAlice in serieAlice.array : \n", " print(noteAlice, end=' ')" ] }, { "cell_type": "markdown", "id": "blocked-scoop", "metadata": {}, "source": [ "

La fonction isnan de la bibliothèque math permet de tester si une valeur est NaN. En utilisant cette fonction, reprennez votre code précédent et n'afficher que les notes qui existent.

" ] }, { "cell_type": "code", "execution_count": 12, "id": "stable-genetics", "metadata": {}, "outputs": [], "source": [ "from math import *" ] }, { "cell_type": "code", "execution_count": 13, "id": "progressive-memory", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15.0 18.0 8.0 " ] } ], "source": [ "for noteAlice in serieAlice.array : \n", " if(not(isnan(noteAlice))) : print(noteAlice, end=' ')" ] }, { "cell_type": "markdown", "id": "finnish-building", "metadata": {}, "source": [ "

Ecrire la fonction dataManquantes(serie) qui renvoie la liste des étiquettes des data manquante dans la série.

" ] }, { "cell_type": "code", "execution_count": 14, "id": "tender-magnitude", "metadata": {}, "outputs": [], "source": [ "def dataManquantes(serie) : \n", " n=len(serie.index)\n", " res=[]\n", " for i in range(n) : \n", " if(isnan(serie.array[i])) : res.append(serie.index[i])\n", " return res" ] }, { "cell_type": "code", "execution_count": 15, "id": "minimal-master", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Notes manquantes pour Alice : ['Info', 'INFO']\n", "Notes manquantes pour Bob : ['INFO']\n" ] } ], "source": [ "print(\"Notes manquantes pour Alice :\", dataManquantes(serieAlice))\n", "print(\"Notes manquantes pour Bob :\", dataManquantes(serieBob))" ] }, { "cell_type": "markdown", "id": "developmental-sally", "metadata": {}, "source": [ "

Les cadres de données

\n", "

Les cadres de données ou plus communement les dataframe sont des séries multidimensionnelles. Considérons l'exemple suivant.

" ] }, { "cell_type": "code", "execution_count": 16, "id": "continent-sweden", "metadata": {}, "outputs": [], "source": [ "Alice={\n", " 'Math':15,\n", " 'Stat':18,\n", " 'Proba':8\n", "}\n", "Bob={\n", " 'Math':10.5,\n", " 'Stat':9,\n", " 'Proba':10,\n", " 'Info':17\n", "}\n", "\n", "CLASSE={\n", " \"Alice\" : Alice, \n", " \"Bob\" : Bob\n", "}" ] }, { "cell_type": "markdown", "id": "otherwise-cylinder", "metadata": {}, "source": [ "

La fonction DataFrame transforme cette donnée un objet (plus structuré) de pandas.

" ] }, { "cell_type": "code", "execution_count": 17, "id": "portuguese-laundry", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Alice Bob\n", "Math 15.0 10.5\n", "Stat 18.0 9.0\n", "Proba 8.0 10.0\n", "Info NaN 17.0\n" ] } ], "source": [ "Classe = pd.DataFrame(CLASSE)\n", "print(Classe)" ] }, { "cell_type": "markdown", "id": "abstract-devon", "metadata": {}, "source": [ "

Comme pour les tableaux à double entrée, on peut récupérer les données (un étudiant) en précisant l'étiquette de cette donnée. L'objet que l'on récupère est une série.

" ] }, { "cell_type": "code", "execution_count": 18, "id": "horizontal-single", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Math 10.5\n", "Stat 9.0\n", "Proba 10.0\n", "Info 17.0\n", "Name: Bob, dtype: float64\n" ] } ], "source": [ "print(Classe['Bob'])" ] }, { "cell_type": "code", "execution_count": 19, "id": "helpful-particle", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Matières : ['Math', 'Stat', 'Proba', 'Info']\n", "Note de Alice : [15.0, 18.0, 8.0, nan]\n", "Note de Bob : [10.5, 9.0, 10.0, 17.0]\n" ] } ], "source": [ "print(\"Matières :\", list(Classe.index))\n", "for etu in Classe : \n", " print(\"Note de\", etu, \":\", list(Classe[etu].array))" ] }, { "cell_type": "markdown", "id": "unauthorized-publicity", "metadata": {}, "source": [ "

Voici des notes pour 5 matières pour une classe de 30 étudiants. Proposer un programme transformant ces données en dataframe avec les index qui sont les matières.

" ] }, { "cell_type": "code", "execution_count": 20, "id": "multiple-concern", "metadata": {}, "outputs": [], "source": [ "data = {\n", " 'Note 1': {'Etudiant 1': 11.0, 'Etudiant 2': 5.5, 'Etudiant 3': 8.0, 'Etudiant 4': 8.5, 'Etudiant 5': 15.0, 'Etudiant 6': 18.0, 'Etudiant 7': 7.5, 'Etudiant 8': 15.5, 'Etudiant 9': 17.5, 'Etudiant 10': 13.0, 'Etudiant 11': 9.0, 'Etudiant 12': 19.0, 'Etudiant 13': 15.5, 'Etudiant 14': 7.0, 'Etudiant 15': 15.5, 'Etudiant 16': 17.0, 'Etudiant 17': 19.5, 'Etudiant 18': 17.5, 'Etudiant 19': 4.0, 'Etudiant 20': 20.0, 'Etudiant 21': 2.5, 'Etudiant 22': 0.5, 'Etudiant 23': 0.0, 'Etudiant 24': 5.0, 'Etudiant 25': 7.0, 'Etudiant 26': 15.0, 'Etudiant 27': 18.0, 'Etudiant 28': 11.0, 'Etudiant 29': 8.0, 'Etudiant 30': 1.0}, \n", " 'Note 2': {'Etudiant 1': 4.0, 'Etudiant 2': 7.5, 'Etudiant 3': 5.5, 'Etudiant 4': 2.0, 'Etudiant 5': 8.0, 'Etudiant 6': 8.5, 'Etudiant 7': 7.0, 'Etudiant 8': 0.0, 'Etudiant 9': 3.5, 'Etudiant 10': 8.0, 'Etudiant 11': 9.5, 'Etudiant 12': 20.0, 'Etudiant 13': 18.0, 'Etudiant 14': 12.0, 'Etudiant 15': 0.5, 'Etudiant 16': 18.0, 'Etudiant 17': 3.0, 'Etudiant 18': 16.0, 'Etudiant 19': 2.0, 'Etudiant 20': 12.0, 'Etudiant 21': 7.0, 'Etudiant 22': 2.5, 'Etudiant 23': 2.5, 'Etudiant 24': 6.0, 'Etudiant 25': 18.5, 'Etudiant 26': 3.5, 'Etudiant 27': 3.0, 'Etudiant 28': 18.5, 'Etudiant 29': 15.0, 'Etudiant 30': 10.5}, \n", " 'Note 3': {'Etudiant 1': 14.0, 'Etudiant 2': 10.0, 'Etudiant 3': 17.5, 'Etudiant 4': 15.0, 'Etudiant 5': 0.0, 'Etudiant 6': 17.0, 'Etudiant 7': 1.5, 'Etudiant 8': 7.0, 'Etudiant 9': 20.0, 'Etudiant 10': 16.5, 'Etudiant 11': 2.0, 'Etudiant 12': 11.0, 'Etudiant 13': 14.5, 'Etudiant 14': 7.0, 'Etudiant 15': 2.5, 'Etudiant 16': 19.0, 'Etudiant 17': 4.5, 'Etudiant 18': 5.0, 'Etudiant 19': 19.0, 'Etudiant 20': 20.0, 'Etudiant 21': 2.5, 'Etudiant 22': 2.0, 'Etudiant 23': 6.0, 'Etudiant 24': 15.0, 'Etudiant 25': 17.0, 'Etudiant 26': 9.5, 'Etudiant 27': 2.0, 'Etudiant 28': 15.5, 'Etudiant 29': 0.5, 'Etudiant 30': 1.0}, \n", " 'Note 4': {'Etudiant 1': 5.5, 'Etudiant 2': 12.5, 'Etudiant 3': 6.0, 'Etudiant 4': 16.5, 'Etudiant 5': 9.0, 'Etudiant 6': 3.5, 'Etudiant 7': 19.5, 'Etudiant 8': 18.5, 'Etudiant 9': 2.0, 'Etudiant 10': 7.5, 'Etudiant 11': 9.5, 'Etudiant 12': 8.5, 'Etudiant 13': 7.0, 'Etudiant 14': 11.5, 'Etudiant 15': 15.5, 'Etudiant 16': 13.5, 'Etudiant 17': 18.5, 'Etudiant 18': 13.5, 'Etudiant 19': 4.0, 'Etudiant 20': 12.5, 'Etudiant 21': 15.0, 'Etudiant 22': 19.0, 'Etudiant 23': 6.5, 'Etudiant 24': 16.0, 'Etudiant 25': 10.5, 'Etudiant 26': 19.0, 'Etudiant 27': 3.0, 'Etudiant 28': 7.0, 'Etudiant 29': 19.0, 'Etudiant 30': 15.5}, \n", " 'Note 5': {'Etudiant 1': 6.0, 'Etudiant 2': 12.0, 'Etudiant 3': 1.0, 'Etudiant 4': 10.0, 'Etudiant 5': 20.0, 'Etudiant 6': 10.0, 'Etudiant 7': 8.0, 'Etudiant 8': 12.5, 'Etudiant 9': 6.5, 'Etudiant 10': 11.5, 'Etudiant 11': 13.0, 'Etudiant 12': 8.5, 'Etudiant 13': 11.0, 'Etudiant 14': 10.5, 'Etudiant 15': 13.5, 'Etudiant 16': 13.5, 'Etudiant 17': 2.0, 'Etudiant 18': 18.5, 'Etudiant 19': 2.5, 'Etudiant 20': 0.0, 'Etudiant 21': 19.0, 'Etudiant 22': 14.0, 'Etudiant 23': 0.5, 'Etudiant 24': 4.0, 'Etudiant 25': 0.0, 'Etudiant 26': 15.0, 'Etudiant 27': 10.5, 'Etudiant 28': 19.0, 'Etudiant 29': 5.0, 'Etudiant 30': 13.0}\n", "}" ] }, { "cell_type": "code", "execution_count": 21, "id": "published-minneapolis", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Etudiant 1 Etudiant 2 Etudiant 3 Etudiant 4 Etudiant 5 \\\n", "Note 1 11.0 5.5 8.0 8.5 15.0 \n", "Note 2 4.0 7.5 5.5 2.0 8.0 \n", "Note 3 14.0 10.0 17.5 15.0 0.0 \n", "Note 4 5.5 12.5 6.0 16.5 9.0 \n", "Note 5 6.0 12.0 1.0 10.0 20.0 \n", "\n", " Etudiant 6 Etudiant 7 Etudiant 8 Etudiant 9 Etudiant 10 ... \\\n", "Note 1 18.0 7.5 15.5 17.5 13.0 ... \n", "Note 2 8.5 7.0 0.0 3.5 8.0 ... \n", "Note 3 17.0 1.5 7.0 20.0 16.5 ... \n", "Note 4 3.5 19.5 18.5 2.0 7.5 ... \n", "Note 5 10.0 8.0 12.5 6.5 11.5 ... \n", "\n", " Etudiant 21 Etudiant 22 Etudiant 23 Etudiant 24 Etudiant 25 \\\n", "Note 1 2.5 0.5 0.0 5.0 7.0 \n", "Note 2 7.0 2.5 2.5 6.0 18.5 \n", "Note 3 2.5 2.0 6.0 15.0 17.0 \n", "Note 4 15.0 19.0 6.5 16.0 10.5 \n", "Note 5 19.0 14.0 0.5 4.0 0.0 \n", "\n", " Etudiant 26 Etudiant 27 Etudiant 28 Etudiant 29 Etudiant 30 \n", "Note 1 15.0 18.0 11.0 8.0 1.0 \n", "Note 2 3.5 3.0 18.5 15.0 10.5 \n", "Note 3 9.5 2.0 15.5 0.5 1.0 \n", "Note 4 19.0 3.0 7.0 19.0 15.5 \n", "Note 5 15.0 10.5 19.0 5.0 13.0 \n", "\n", "[5 rows x 30 columns]\n" ] } ], "source": [ "#Solution 1, la méthode 'transpose()' échange les data et les index\n", "df=pd.DataFrame(data).transpose()\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 22, "id": "genetic-conclusion", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Etudiant 1 Etudiant 2 Etudiant 3 Etudiant 4 Etudiant 5 \\\n", "Note 1 11.0 5.5 8.0 8.5 15.0 \n", "Note 2 4.0 7.5 5.5 2.0 8.0 \n", "Note 3 14.0 10.0 17.5 15.0 0.0 \n", "Note 4 5.5 12.5 6.0 16.5 9.0 \n", "Note 5 6.0 12.0 1.0 10.0 20.0 \n", "\n", " Etudiant 6 Etudiant 7 Etudiant 8 Etudiant 9 Etudiant 10 ... \\\n", "Note 1 18.0 7.5 15.5 17.5 13.0 ... \n", "Note 2 8.5 7.0 0.0 3.5 8.0 ... \n", "Note 3 17.0 1.5 7.0 20.0 16.5 ... \n", "Note 4 3.5 19.5 18.5 2.0 7.5 ... \n", "Note 5 10.0 8.0 12.5 6.5 11.5 ... \n", "\n", " Etudiant 21 Etudiant 22 Etudiant 23 Etudiant 24 Etudiant 25 \\\n", "Note 1 2.5 0.5 0.0 5.0 7.0 \n", "Note 2 7.0 2.5 2.5 6.0 18.5 \n", "Note 3 2.5 2.0 6.0 15.0 17.0 \n", "Note 4 15.0 19.0 6.5 16.0 10.5 \n", "Note 5 19.0 14.0 0.5 4.0 0.0 \n", "\n", " Etudiant 26 Etudiant 27 Etudiant 28 Etudiant 29 Etudiant 30 \n", "Note 1 15.0 18.0 11.0 8.0 1.0 \n", "Note 2 3.5 3.0 18.5 15.0 10.5 \n", "Note 3 9.5 2.0 15.5 0.5 1.0 \n", "Note 4 19.0 3.0 7.0 19.0 15.5 \n", "Note 5 15.0 10.5 19.0 5.0 13.0 \n", "\n", "[5 rows x 30 columns]\n" ] } ], "source": [ "#Solution 2 : on crée un data frame à la main.\n", "df=pd.DataFrame(data)\n", "X={}\n", "for etu in df.index : \n", " X[etu]={}\n", " for note in df.columns : X[etu][note]=df[note][etu]\n", "df=pd.DataFrame(X)\n", "print(df)" ] }, { "cell_type": "markdown", "id": "spread-affairs", "metadata": {}, "source": [ "

Avec excel...

\n", "

... rien de plus simple ! La fonction read_excel permet de lire et créer un tableau excel et d'associer les noms des indices et des colonnes en fonction des valeurs précisées. Prenons par exemple, les données parcourSup du département STID, dans le fichier PS_STID.xlsx.\n", "\n", "

" ] }, { "cell_type": "code", "execution_count": 23, "id": "silent-auckland", "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel(\"PS_STID.xlsx\")" ] }, { "cell_type": "code", "execution_count": 24, "id": "promotional-lighter", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Groupe Classement Code aménagement (oui - si) Sexe Date de naissance \\\n", "0 150235 ECF NaN F NaN \n", "1 150235 ECF NaN M NaN \n", "2 150236 ECF NaN M NaN \n", "3 150235 ENCF NaN M NaN \n", "4 150235 ECF NaN M NaN \n", "... ... ... ... ... ... \n", "1186 150235 ECF NaN M NaN \n", "1187 150235 ECF NaN M NaN \n", "1188 150236 ECF NaN M NaN \n", "1189 150235 ECF NaN F NaN \n", "1190 150235 ECF NaN M NaN \n", "\n", " Boursier des lycées Boursier \\\n", "0 Non Non boursier \n", "1 Non Non boursier \n", "2 Non Non boursier \n", "3 Non Non boursier \n", "4 Non Boursier de l'enseignement supérieur \n", "... ... ... \n", "1186 Non Non boursier \n", "1187 Non Non boursier \n", "1188 Non Boursier de l'enseignement supérieur \n", "1189 Non Non boursier \n", "1190 Non Non boursier \n", "\n", " Boursier certifié \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 Certifié via SIECLE ou AGLAE \n", "... ... \n", "1186 NaN \n", "1187 Non \n", "1188 Certifié via SIECLE ou AGLAE \n", "1189 Non \n", "1190 Non \n", "\n", " Libellé établissement \\\n", "0 NaN \n", "1 LEA-CFI L'école connectée au futur de l'industrie \n", "2 Lycée Henri Bergson-Jacquard \n", "3 Université Paris Nanterre \n", "4 Université Gustave Eiffel \n", "... ... \n", "1186 Lycée Français de Lomé \n", "1187 Lycée Kléber \n", "1188 Lycée Jean Jaures \n", "1189 Lycée Andre Boulloche \n", "1190 Lycée Louis Jouvet \n", "\n", " Commune établissement ... \\\n", "0 NaN ... \n", "1 Orly ... \n", "2 Paris 19e Arrondissement ... \n", "3 Nanterre ... \n", "4 Marne-la-Vallée ... \n", "... ... ... \n", "1186 Lomé ... \n", "1187 Strasbourg ... \n", "1188 Argenteuil ... \n", "1189 Livry-Gargan ... \n", "1190 Taverny ... \n", "\n", " Moyenne candidat en Mathématiques Expertes Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne classe en Mathématiques Expertes Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne plus basse en Mathématiques Expertes Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne plus haute en Mathématiques Expertes Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Type de saisie en Mathématiques Expertes Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne candidat en Mathématiques Complémentaires Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne classe en Mathématiques Complémentaires Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne plus basse en Mathématiques Complémentaires Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Moyenne plus haute en Mathématiques Complémentaires Trimestre 3.1 \\\n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", " Type de saisie en Mathématiques Complémentaires Trimestre 3.1 \n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "1186 NaN \n", "1187 NaN \n", "1188 NaN \n", "1189 NaN \n", "1190 NaN \n", "\n", "[1191 rows x 758 columns]\n" ] } ], "source": [ "print(df)" ] }, { "cell_type": "markdown", "id": "continental-vatican", "metadata": {}, "source": [ "

Dans ce tableur, l'indice Classemment indique si le candidat a confirmé son voeu. Si c'est le cas, la valeur vaut ECF sinon elle vaut ENCF

\n", "\n", "

Combien de voeux ont été confirmé ?

" ] }, { "cell_type": "code", "execution_count": 25, "id": "behind-unemployment", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nombre de voeux confirmés : 1084\n" ] } ], "source": [ "nbETU=len(df)\n", "nbECF=0\n", "for i in df.index : \n", " if(df['Classement'][i]=='ECF') : nbECF+=1\n", "print(\"Nombre de voeux confirmés :\", nbECF)" ] }, { "cell_type": "markdown", "id": "brilliant-vitamin", "metadata": {}, "source": [ "

Dans un diagramme circulaire, représenter la répartition des candidats suivant leur département de leur lycée d'origine (attention aux valeur NaN).

" ] }, { "cell_type": "code", "execution_count": 26, "id": "danish-happening", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.pyplot import *\n", "col='Département établissement'\n", "X={}#Variable dont les clefs sont les départements et les valeurs le nombre de candidat\n", "for i in df.index : \n", " dep=df[col][i]#On récupère le numéro du département\n", " if(isnan(dep)) : continue#Si c'est NaN, on avance\n", " dep=int(dep)#On converti en entier (parce qu'un département est un entier)\n", " try : X[dep]+=1#On essaye d'incrémenter de 1\n", " except : X[dep]=1#Sinon on crée et on met 1\n", "\n", "#Après avoir cherché 'diagramme circulaire python' sur internet, j'ai trouvé ça : https://fr.moonbooks.org/Articles/Simple-diagramme-circulaire-avec-matplotlib/\n", "#En adaptant, on a :\n", "Taille = [X[dep] for dep in X]\n", "Labels = [dep for dep in X]\n", "pie(Taille, labels=Labels)\n", "show()" ] }, { "cell_type": "code", "execution_count": null, "id": "veterinary-electricity", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 5 }